package com.example.tsproject.Utils;
import java.util.regex.Pattern;
/**
 * @BelongsProject: t-s-project
 * @BelongsPackage: com.example.tsproject.Utils
 * @Author: YoungDra
 * @CreateTime: 2024/11/24  10:41
 */
public class sql {
    public static String formatSqlToOneLine(String sql) {
        // 去除 SQL 语句中的换行符和多余的空格
        sql = sql.replaceAll("\\s+", " ");
        sql = sql.replaceAll("\\r?\\n", "");
        return sql;
    }
        // 仅允许SELECT开头（忽略大小写和前导空格）
        private static final Pattern SELECT_PATTERN =
                Pattern.compile("^\\s*SELECT\\s+.*", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

        // 禁止危险关键词（如INSERT/UPDATE等）
        private static final Pattern DANGER_KEYWORDS =
                Pattern.compile("\\b(INSERT|UPDATE|DELETE|DROP|EXEC|TRUNCATE|;)\\b", Pattern.CASE_INSENSITIVE);

        // 仅允许videos表（简易正则匹配）
        private static final Pattern ALLOWED_TABLE =
                Pattern.compile("FROM\\s+videos\\b", Pattern.CASE_INSENSITIVE);
    /**
     * 校验SQL合法性
     * @param sql 用户输入的SQL语句
     * @return true=合法，false=非法
     */
    public static boolean isValidQuery(String sql) {
        if (sql == null || sql.trim().isEmpty()) return false;

        // 1. 去除SQL注释（避免注释绕过检测）
        String cleanSql = sql.replaceAll("/\\*.*?\\*/", "").replaceAll("--.*", "");

        // 2. 统一转为小写（防大小写绕过）
        String lowerSql = cleanSql.toLowerCase();

        // 3. 基础格式校验
        if (!SELECT_PATTERN.matcher(lowerSql).find()) return false;

        // 4. 危险操作拦截
        if (DANGER_KEYWORDS.matcher(lowerSql).find()) return false;

        // 5. 表名白名单校验
        if (!ALLOWED_TABLE.matcher(lowerSql).find()) return false;

        return true;
    }

}
